package com.lifang.imgsoa.houseimagefile.service;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import net.coobird.thumbnailator.geometry.Positions;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import com.lifang.imgsoa.aop.BusinessException;
import com.lifang.imgsoa.model.ImageKeyObject;
import com.lifang.imgsoa.util.ErrorEnum;
import com.lifang.imgsoa.util.Global;
import com.lifang.imgsoa.util.ImgEnum;
import com.lifang.imgsoa.util.OSSObjectUtilOriginal;
import com.lifang.imgsoa.util.OSSObjectUtilWater;
import com.lifang.imgsoa.util.StringUtil;
import com.lifang.imgsoa.util.ThumbnailUtil;
import com.lifang.utils.statistics.StatisticsTimeMonitor;

/**
 * @date 2014年4月26日 下午2:30:54
 * @author Tom
 * @description 房源服务类
 */
@Service(value = "houseImageFileService")
@Scope(value = "singleton")
public class HouseImageFileServiceImpl implements HouseImageFileService {
//	
//	@Value("${S_constants.ALIYUN_IMAGE_HTTP}")
//	private String aliyunImageHttp;
//	
//	@Value("${S_constants.ALIYUN_IMAGE_HTTP_INTERNAL}")
//	private String aliyunImageHttp4Internal;
//	
//	Logger logger = LoggerFactory.getLogger(HouseImageFileServiceImpl.class);
//	
//	private StatisticsTimeMonitor statisticsTimeMonitor_createImages = new StatisticsTimeMonitor("createImages"); 
//	private StatisticsTimeMonitor statisticsTimeMonitor_uploadImage2aliyun = new StatisticsTimeMonitor("uploadImage2aliyun"); 
//	
//	private final int WIDTH_1920 = 1920;
//	private final int HEIGHT_1920 = 1920;
//	
//	private final int WIDTH_640 = 640;
//	private final int HEIGHT_640 = 640;
//
//	
//	/**
//	 * @date 2014年7月9日 下午3:23:00
//	 * @author Tom
//	 * @description  
//	 * 获得水印路径
//	 */
//	private String getLFWaterMarkPath() {
//		return System.getProperty("HouseImageSOA.root") + File.separator + "images" + File.separator + "agent_watermark.png";
//	}
//	/**
//	 * 
//	 * 功能描述:获取水印图片文件
//	 *
//	 * <pre>
//	 * Modify Reason:(修改原因,不需覆盖，直接追加.)
//	 *     Andy:   2015年3月30日      新建
//	 * </pre>
//	 *
//	 * @return
//	 */
//	private File getLFWaterMarkFile(){
//		return new File(getLFWaterMarkPath());
//	}
//	//获取左下角图片路径
//	private String getLFWaterMarkPathTopLeft(){
//		return System.getProperty("HouseImageSOA.root") + File.separator + "images" + File.separator + "top_left_watermark.png";
//	}
//	//获取右下角图片路径
//	private String getLFWaterMarkPathBottomRight(){
//		return System.getProperty("HouseImageSOA.root") + File.separator + "images" + File.separator + "bottom_right_watermark.png";
//	}
//	//获取左上角图片文件
//	private File getLFWaterMarkFileTopLeft(){
//		return new File(getLFWaterMarkPathTopLeft());
//	}
//	//获取右下角图片文件
//	private File getLFWaterMarkFileBottomRight(){
//		return new File(getLFWaterMarkPathBottomRight());
//	}
//	
//	//获取悟空找房的水印图片路径
//	private String getWKZFWaterMarkPath(){
//		return System.getProperty("HouseImageSOA.root") + File.separator + "images" + File.separator + "wkzf_watermark.png";
//	}
//	//获取悟空找房图片文件
//	private File getWKZFWaterMarkFile(){
//		return new File(getWKZFWaterMarkPath());
//	}
//	
//	
//	
//	
//	private byte[] getByteFromByteArrayOutputStream(ByteArrayOutputStream byteArrayOutputStream) {
//		byte[] bytes = null; 
//		try {
//			bytes = byteArrayOutputStream.toByteArray();
//			byteArrayOutputStream.close();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//
//		return bytes;
//	}
//	
//	
//	/**
//	 * 
//	 * 功能描述:获取图片的流
//	 *
//	 *@author Andy:   2015年3月30日 
//	 *
//	 * @param fileBytes
//	 * @param key
//	 * @return
//	 */
//	public Map<String, byte[]> createImages_stream(byte[] fileBytes, String key) {
//		try {
//			Long timeBegin = System.currentTimeMillis();
//			Map<String, byte[]> map = new HashMap<>();
//			//1、将原图放入map
//			map.put(key, fileBytes);
//			
//			//对原图进行旋转矫正
//			byte[] newFileBytes = getByteFromByteArrayOutputStream(ThumbnailUtil.getByteArrayOutputStream(fileBytes));
//			
//			//该处的业务逻辑就是：如果是剪裁的，不进行打水印，直接进行剪裁，如果不是裁剪的，需要把图片缩放到640*640，然后进行打水印，之后再进行一定尺寸的缩放操作
//			//遍历图片的规格进行处理
//			for (ImgEnum img : ImgEnum.values()) {
//				ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//				ByteArrayInputStream inputStream = new ByteArrayInputStream(newFileBytes);
//				if(img.getStatus()==0){
//					//直接使用裁剪的方法
//					ThumbnailUtil.getCutImage(inputStream, outputStream, img);
//				}else{
//					//把原图缩放到640*640  然后进行打水印
//					if(img == ImgEnum.DL){//加之乘的不打水印
//						//水印在中心
//						//ThumbnailUtil.getWaterFile(newFileBytes, this.getLFWaterMarkFile(), outputStream,WIDTH_640,HEIGHT_640);
//						
//						//水印在左上角
//						ThumbnailUtil.getWaterFileTopLeft(newFileBytes, this.getLFWaterMarkFileTopLeft(), outputStream, WIDTH_640,HEIGHT_640);
//						
//						//水印在右下角
//						byte[] topleftFileBytes = getByteFromByteArrayOutputStream(outputStream);
//						outputStream = new ByteArrayOutputStream();
//						ThumbnailUtil.getWaterFileBottomRight(topleftFileBytes, this.getLFWaterMarkFileBottomRight(), outputStream, WIDTH_640,HEIGHT_640);
//						
//					}else if(img == ImgEnum.DW){
//						//悟空找房的水印
//						ThumbnailUtil.getWaterFile(newFileBytes, this.getWKZFWaterMarkFile(), Positions.BOTTOM_RIGHT, outputStream, WIDTH_640,HEIGHT_640);
//					}
//					//把打完水印之后的按照一定比例缩放
//					ThumbnailUtil.getThumbnailStream(inputStream, outputStream, img);
//				}
//				byte[] thumbnailByte = getByteFromByteArrayOutputStream(outputStream);
//				map.put(key + "." +img, thumbnailByte);
//			}
//			
//			statisticsTimeMonitor_createImages.exeNormal(System.currentTimeMillis() - timeBegin);
//			return map;
//		} catch (IOException e1) {
//			e1.printStackTrace();
//			logger.error(e1.getMessage());
//			throw new BusinessException(ErrorEnum.SOA_ERROR_100003);
//		}
//
//	}
//	
//	/**
//	 * @date 2014年7月15日 下午8:17:01
//	 * @author Tom
//	 * @description  
//	 * 根据不同图片类型，上传不同的桶下
//	 * 
//	 * 
//	 * 1、原图（大小）uuid    uuid.s
//	 * 
//	 * 2、房源  水印（大小）uuid.fyb   uuid.s.fyb
//	 * 3、吉屋  水印（大小）uuid.iwjw   uuid.s.iwjw
//	 * 4、经纪人 水印（大小）uuid.agent    uuid.s.agent                没有网站地址的
//	 * 
//	 * 5、原图（200*120） uuid.t
//	 * 
//	 * 
//	 */
//	public void uploadImage2aliyun_stream(Map<String, byte[]> map) {
//		Long timeBegin = System.currentTimeMillis();
//		int i = 1;
//		for (Map.Entry<String, byte[]> entry : map.entrySet()) {
//			logger.info("正在上传..{}/{}..{}..size..{}", i++, map.size(), entry.getKey(), entry.getValue().length);
//			//是否是原图
//			boolean isOriginal = true;
//			for(ImgEnum img : ImgEnum.values()){
//				if(entry.getKey().lastIndexOf("."+img) != -1){
//					isOriginal = false;
//					break;
//				}
//			}
//			if(!isOriginal){
//			//if (entry.getKey().lastIndexOf(".lf") != -1 || entry.getKey().lastIndexOf(".pc") != -1 || entry.getKey().lastIndexOf(".agent") != -1 || entry.getKey().lastIndexOf(".t") != -1) {
//				//上传水印图片
//				OSSObjectUtilWater.getInstance().uploadFile_stream(entry.getKey(), entry.getValue());
//			} else {
//				//上传原图
//				OSSObjectUtilOriginal.getInstance().uploadFile_stream(entry.getKey(), entry.getValue());
//			}
//		}
//		statisticsTimeMonitor_uploadImage2aliyun.exeNormal(System.currentTimeMillis() - timeBegin);
//	}
//	
//	/**
//	 * @date 2014年7月10日 下午8:36:11
//	 * @author Tom
//	 * @description  
//	 * 上传图片接口
//	 * 
//	 * @return 
//	 * 返回图片key
//	 */
//	public String uploadSingleFile(byte[] fileBytes, int isMakeOriginal) {
//
//		String key = StringUtil.getrandomUUID();
//		Map<String, byte[]> map = new HashMap<>();
//
//		if (isMakeOriginal == 1) {
//			ByteArrayOutputStream bigImageOutputStream = new ByteArrayOutputStream();
//			try {
//				ThumbnailUtil.getThumbnailStream(new ByteArrayInputStream(fileBytes), bigImageOutputStream, WIDTH_1920, HEIGHT_1920);
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			byte[] bigImageByte = getByteFromByteArrayOutputStream(bigImageOutputStream);
//
//			// 1、得到图片map
//			map = this.createImages_stream(bigImageByte, key);
//
//		} else {
//
//			// 1、得到图片map
//			map = this.createImages_stream(fileBytes, key);
//		}
//
//		// 2、上传
//		this.uploadImage2aliyun_stream(map);
//
//		return key;
//
//	}
//	
//	/**
//	 * @date 2015年3月31日
//	 * @author Andy
//	 * @description  
//	 * 上传经纪人身份证图片接口
//	 * 
//	 * @return 
//	 * 返回图片key
//	 */
//	public String uploadSingleFileNoHandle(byte[] fileBytes) {
//		String key = StringUtil.getrandomUUID();
//		Map<String, byte[]> map = new HashMap<>();
//		
//		map.put(key, fileBytes);
//		
//		// 2、上传
//		this.uploadImage2aliyun_stream(map);
//
//		return key;
//	}
//	
//	
//	/**
//	 * @date 2014年8月28日 上午11:25:24
//	 * @author Tom
//	 * @description  
//	 * 返回图片key aliyun url
//	 */
//	public ImageKeyObject getImageKeyObject(String key) {
//		ImageKeyObject imageKeyObject = new ImageKeyObject();
//		
//		imageKeyObject.setKey(key);
//		imageKeyObject.setOriginal(OSSObjectUtilOriginal.getInstance().getUrl(key));
//		
//		String prefix = aliyunImageHttp + key +".";
//		imageKeyObject.setWater_cl(prefix + ImgEnum.CL);
//		imageKeyObject.setWater_ml(prefix + ImgEnum.ML);
//		imageKeyObject.setWater_al(prefix + ImgEnum.AL);
//		imageKeyObject.setWater_dl(prefix + ImgEnum.DL);
//		imageKeyObject.setWater_dj(prefix + ImgEnum.DJ);
//		imageKeyObject.setWater_dw(prefix + ImgEnum.DW);//悟空找房的水印图片
//		
//		return imageKeyObject;
//	}
//	
//	/**
//	 * @date 2014年8月28日 上午11:25:24
//	 * @author Tom
//	 * @description  
//	 * 返回图片key aliyun url
//	 * 内网调用
//	 */
//	public ImageKeyObject getImageKeyObject4Internal(String key) {
//	    
//	    if (Global.ALIYUN_ECS == 0) {
//	        return getImageKeyObject(key);
//	    }
//	    
//	    ImageKeyObject imageKeyObject = new ImageKeyObject();
//	    
//	    imageKeyObject.setKey(key);
//	    imageKeyObject.setOriginal(OSSObjectUtilOriginal.getInstance().getUrl4Internal(key));
//	    
//	    String prefix = aliyunImageHttp4Internal + key +".";
//	    imageKeyObject.setWater_cl(prefix + ImgEnum.CL);
//	    imageKeyObject.setWater_ml(prefix + ImgEnum.ML);
//	    imageKeyObject.setWater_al(prefix + ImgEnum.AL);
//	    imageKeyObject.setWater_dl(prefix + ImgEnum.DL);
//	    imageKeyObject.setWater_dj(prefix + ImgEnum.DJ);
//	    
//	    return imageKeyObject;
//	}
//	
//	/**
//	 * 
//	 * 直接把图片上传到共有文件夹中，并且不做处理
//	 *
//	 * <pre>
//	 * Modify Reason:(修改原因,不需覆盖，直接追加.)
//	 *     Andy:   2015年4月21日      新建
//	 * </pre>
//	 *
//	 * @param fileBytes
//	 * @return
//	 */
//	@Override
//	public String uploadSingleFileNoHandle2PubBucket(byte[] fileBytes) {
//		String key = StringUtil.getrandomUUID();
//		Long timeBegin = System.currentTimeMillis();
//		logger.info("正在上传原图到共有文件夹..size..{}", fileBytes.length);
//		
//		OSSObjectUtilWater.getInstance().uploadFile_stream(key, fileBytes);
//		
//		statisticsTimeMonitor_uploadImage2aliyun.exeNormal(System.currentTimeMillis() - timeBegin);
//		return key;
//	}
//	/**
//	 * 
//	 * 根据图片的key获取图片共有桶中的url
//	 *
//	 * <pre>
//	 * Modify Reason:(修改原因,不需覆盖，直接追加.)
//	 *     Andy:   2015年4月21日      新建
//	 * </pre>
//	 *
//	 * @param fileBytes
//	 * @return
//	 */
//	@Override
//	public ImageKeyObject getImageKeyUrl(String key) {
//		ImageKeyObject imageKeyObject = new ImageKeyObject();
//		
//		imageKeyObject.setKey(key);
//		imageKeyObject.setOriginal(aliyunImageHttp + key);
//		
//		return imageKeyObject;
//	}
//	
//	/**'
//	 * 根据key上传图片，这个是为了重新处理阿里云上已经存在的图片
//	 * (non-Javadoc)
//	 * @see com.lifang.imgsoa.houseimagefile.service.HouseImageFileService#uploadSingleFileByKey(byte[], int, java.lang.String)
//	 */
//	@Override
//	public String uploadSingleFileByKey(byte[] fileBytes, int isMakeOriginal, String key) {
//		
//		Map<String, byte[]> map = new HashMap<>();
//
//		if (isMakeOriginal == 1) {
//			ByteArrayOutputStream bigImageOutputStream = new ByteArrayOutputStream();
//			try {
//				ThumbnailUtil.getThumbnailStream(new ByteArrayInputStream(fileBytes), bigImageOutputStream, WIDTH_1920, HEIGHT_1920);
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			byte[] bigImageByte = getByteFromByteArrayOutputStream(bigImageOutputStream);
//
//			// 1、得到图片map
//			map = this.createImages_streamByKey(bigImageByte, key);
//
//		} else {
//
//			// 1、得到图片map
//			map = this.createImages_streamByKey(fileBytes, key);
//		}
//
//		// 2、上传
//		this.uploadImage2aliyun_stream(map);
//
//		return key;
//	}
//	
//	/**
//	 * 
//	 * 功能描述:获取图片的流，注意：！！！！该接口只针对利房的640*640的尺寸做水印处理！！！
//	 *
//	 *@author Andy:   2015年3月30日 
//	 *
//	 * @param fileBytes
//	 * @param key
//	 * @return
//	 */
//	public Map<String, byte[]> createImages_streamByKey(byte[] fileBytes, String key) {
//		try {
//			Long timeBegin = System.currentTimeMillis();
//			Map<String, byte[]> map = new HashMap<>();
//			//1、将原图放入map
//			//map.put(key, fileBytes);
//			
//			//对原图进行旋转矫正
//			byte[] newFileBytes = getByteFromByteArrayOutputStream(ThumbnailUtil.getByteArrayOutputStream(fileBytes));
//			
//			//该处的业务逻辑就是：如果是剪裁的，不进行打水印，直接进行剪裁，如果不是裁剪的，需要把图片缩放到640*640，然后进行打水印，之后再进行一定尺寸的缩放操作
//			//遍历图片的规格进行处理
//			for (ImgEnum img : ImgEnum.values()) {
//				if(img != ImgEnum.DL){
//					continue;
//				}
//				ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//				ByteArrayInputStream inputStream = new ByteArrayInputStream(newFileBytes);
//				if(img.getStatus()==0){
//					//直接使用裁剪的方法
//					ThumbnailUtil.getCutImage(inputStream, outputStream, img);
//				}else{
//					//把原图缩放到640*640  然后进行打水印
//					if(img != ImgEnum.DJ){//加之乘的不打水印
//						//水印在中心
//						//ThumbnailUtil.getWaterFile(newFileBytes, this.getLFWaterMarkFile(), outputStream,WIDTH_640,HEIGHT_640);
//						
//						//水印在左上角
//						ThumbnailUtil.getWaterFileTopLeft(newFileBytes, this.getLFWaterMarkFileTopLeft(), outputStream, WIDTH_640,HEIGHT_640);
//						
//						//水印在右下角
//						byte[] topleftFileBytes = getByteFromByteArrayOutputStream(outputStream);
//						outputStream = new ByteArrayOutputStream();
//						ThumbnailUtil.getWaterFileBottomRight(topleftFileBytes, this.getLFWaterMarkFileBottomRight(), outputStream, WIDTH_640,HEIGHT_640);
//					}
//					//把打完水印之后的按照一定比例缩放
//					ThumbnailUtil.getThumbnailStream(inputStream, outputStream, img);
//				}
//				byte[] thumbnailByte = getByteFromByteArrayOutputStream(outputStream);
//				map.put(key + "." +img, thumbnailByte);
//			}
//			
//			statisticsTimeMonitor_createImages.exeNormal(System.currentTimeMillis() - timeBegin);
//			return map;
//		} catch (IOException e1) {
//			e1.printStackTrace();
//			logger.error(e1.getMessage());
//			throw new BusinessException(ErrorEnum.SOA_ERROR_100003);
//		}
//
//	}
//	
//	
//	
//	/**
//	 * 
//	 * (non-Javadoc)
//	 * @see com.lifang.imgsoa.houseimagefile.service.HouseImageFileService#uploadWKZFImage(byte[], java.lang.String)
//	 */
//	@Override
//	public String uploadWKZFImage(byte[] fileBytes, String key) {
//
//		Map<String, byte[]> map = new HashMap<>();
//		try {
//			Long timeBegin = System.currentTimeMillis();
//			
//			//该处的业务逻辑就是：如果是剪裁的，不进行打水印，直接进行剪裁，如果不是裁剪的，需要把图片缩放到640*640，然后进行打水印，之后再进行一定尺寸的缩放操作
//			//遍历图片的规格进行处理
//			for (ImgEnum img : ImgEnum.values()) {
//				if(img != ImgEnum.DW){
//					continue;
//				}
//				ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//				ThumbnailUtil.getWaterFile(fileBytes, this.getWKZFWaterMarkFile(), Positions.BOTTOM_RIGHT, outputStream, WIDTH_640,HEIGHT_640);
//				byte[] thumbnailByte = getByteFromByteArrayOutputStream(outputStream);
//				map.put(key + "." +img, thumbnailByte);
//			}
//			
//			statisticsTimeMonitor_createImages.exeNormal(System.currentTimeMillis() - timeBegin);
//		} catch (IOException e1) {
//			e1.printStackTrace();
//			logger.error(e1.getMessage());
//			throw new BusinessException(ErrorEnum.SOA_ERROR_100003);
//		}
//
//		// 2、上传
//		this.uploadImage2aliyun_stream(map);
//
//		return key;
//	}
//	
//	/**
//	 * 
//	 * (non-Javadoc)
//	 * @see com.lifang.imgsoa.houseimagefile.service.HouseImageFileService#uploadFileNoHandleByKey(java.lang.String, java.lang.String, int)
//	 */
//	@Override
//	public String uploadFileNoHandleByKey(byte[] fileBytes, String key, int priBucket) {
//		
//		Long timeBegin = System.currentTimeMillis();
//		
//		if(priBucket != 1){
//			logger.info("正在上传图片到共有文件夹.key:{}..size..{}", key,fileBytes.length);
//			//上传到共有桶
//			OSSObjectUtilWater.getInstance().uploadFile_stream(key, fileBytes);
//		} else {
//			logger.info("正在上传图片到私有文件夹.key:{}..size..{}", key, fileBytes.length);
//			//上传到私有桶
//			OSSObjectUtilOriginal.getInstance().uploadFile_stream(key, fileBytes);
//		}
//		logger.info("上传成功key：{}", key);
//		
//		statisticsTimeMonitor_uploadImage2aliyun.exeNormal(System.currentTimeMillis() - timeBegin);
//		
//		return key;
//	}
	
	
}
	

